# 听说你会Python ?
# https://www.pythontab.com/html/2018/mianshiti_0719/1326.html

'''
# 1. 列表迭代器
class A(object):
    x = 1
    # NameError: name 'x' is not defined
    # gen = (x for _ in range(10)) # xrange 是python2.7的内置函数，3.x改成range

    # 正确做法1
    # gen = (A.x for _ in range(10))

    # 正确做法2
    # gen = (lambda x:(x for _ in range(10)))(x) #使用lambda表达式，定义一个函数，并调用函数传入参数x，等价于如下代码
    y = lambda x:(x for _ in range(10))
    gen = y(x)


if __name__ == "__main__":
    print(list(A.gen))

'解释原因：作用域的问题，这个问题是变量作用域问题，在 gen=(x for _ in xrange(10)) 中 gen 是一个 generator ,在 generator
'中变量有自己的一套作用域，与其余作用域空间相互隔离

'The scope of names defined in a class block is limited to the class block; it does not extend to the code blocks of /
'methods – this includes comprehensions and generator expressions since they are implemented using a function scope.

'''
'''
# 附录1 lambda 表达式创建匿名函数 https://www.cnblogs.com/z941030/p/4838649.html

#lambda函数的语法只包含一个语句： lambda [arg1 [,arg2,.....argn]]:expression
square = lambda x:x**2
print(square(2))
sum = lambda x,y :x+y
print(sum(3,4))

'lambda只是一个表达式，函数体比def简单很多
'lambda的主体是一个表达式，而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去
'lambda函数拥有自己的名字空间，且不能访问自有参数列表之外或全局名字空间里的参数
'虽然lambda函数看起来只能写一行，却不等同于C或C++的内联函数，后者的目的是调用小函数时不占用栈内存从而增加运行效率

'''
# 附录2 __call__()特殊函数 https://www.cnblogs.com/superxuezhazha/p/5793536.html
# 1. python中函数就是对象
f = abs
print(f.__name__) #abs
print(f(-123)) #123

#2. 实现了__call__方法的对象就可以作为函数调用
class Person(object):
    def __init__(self, name, gender):
        self.name = name
        self.gender = gender

    def __call__(self, friend):
        print('My name is %s...' % self.name)
        print('My friend is %s...' % friend)

p = Person('Bob', 'male')
print(p('Tim'))
# 结果
# My name is Bob...
# My friend is Tim...

#附录3. 迭代器与生成器 https://www.runoob.com/python3/python3-iterator-generator.html


#附录4. 装饰器 https://www.runoob.com/w3cnote/python-func-decorators.html



